package com.swak.reactivex.transport.serialize;

import com.swak.exception.SerializeException;
import com.swak.registry.URL;
import com.swak.spi.Adaptive;
import com.swak.spi.SPI;

/**
 * 序列化: 可以在url中定义 serialization=xxx 来取代默认的值
 * 
 * @author 618lf
 */
@SPI("kryo")
public interface Serialization {

	byte KRYO_SERIALIZATION_TYPE = 1;
	byte[] None = new byte[0];

	/**
	 * 序列化的类型
	 * 
	 * @return
	 */
	byte getType();

	/**
	 * 调用实际的序列化工具 -- 序列化
	 *
	 * @param obj 对象
	 * @return 字节数组
	 * @throws SerializeException 序列化错误
	 */
	@Adaptive
	byte[] serialize(URL url, Object obj) throws SerializeException;

	/**
	 * 调用实际的序列化工具 -- 反序列化
	 *
	 * @param bytes 字节数组
	 * @return 对象
	 * @throws SerializeException 序列化错误
	 */
	@Adaptive
	<T> T deserialize(URL url, byte[] bytes) throws SerializeException;
}
